//
//  ProblemOffer65.swift
//  TestProject
//
//  Created by 武侠 on 2022/3/9.
//  Copyright © 2022 zhulong. All rights reserved.
//

import UIKit

/*
 剑指 Offer 65. 不用加减乘除做加法
 写一个函数，求两个整数之和，要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
 示例:
     输入: a = 1, b = 1
     输出: 2
 提示：
     a, b 均可能是负数或 0
     结果不会溢出 32 位整数
 */
class ProblemOffer65: NSObject {
    
    /*
     求和：a + b 还可以换成 进位 + 无进位的和
     例如：5 + 8 => 10 + 3  10就是产生了进位，3就是无进位的和
     无进位的和的求法：sum0 = a ^ b
     进位的求法：sum1 = (aa & bb) << 1
     */
    func add(_ a: Int, _ b: Int) -> Int {
        var aa = a, bb = b, c = 0
        while bb != 0 {
            c = (aa & bb) << 1  // 进位
            aa ^= bb            // 无进位的和
            bb = c
        }
        
        return aa
    }
}
